# 作者: 菅世博
# 2025年02月24日09时54分46秒
# 512326042@qq.com
list1 = [1, 3, 2, 4, 5, 3, 2]

print(sorted(list1))
print(list1)
# list1.sort() # 没有返回值
# print(list1)

print(sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}))
print('-' * 50)
str_list = 'This is a test string from Andrew'.split()
print(str_list)
print(sorted(str_list))


def str_lower(str1: str):
    """
    比较规则函数
    :param str1:
    :return:
    """
    return str1.lower()


# str_lower函数是sorted内部进行调用的
print(sorted(str_list, key=str_lower))
print(sorted(str_list, key=str_lower))
print('-' * 50)
# shift+alt 是竖选
student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]
# 匿名函数，函数在当前位置只使用一次，不需要在其他位置再次调用，就会使用匿名函数
# lambda表达式就是一个匿名函数
# 匿名函数提升了效率
print(sorted(student_tuples, key=lambda x: x[1]))


class Student:
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age

    def __str__(self):
        """
        类似于__repr__，str可以返回其他类型
        :return:
        """
        return self.name

    def __repr__(self):
        """
        类似于__str__，repr可以返回其他类型
        :return:
        """
        return repr((self.name, self.grade, self.age))


student_objects = [
    Student('john', 'A', 15),
    Student('jane', 'B', 12),
    Student('dave', 'B', 10),
]

# s = Student('john', 'A', 15)
# print(s)

# 排序对象
print(sorted(student_objects, key=lambda student: student.age))
print('-' * 50)
from operator import itemgetter, attrgetter

print(sorted(student_objects, key=itemgetter(2)))  # 用于元祖或列表
print(sorted(student_objects, key=attrgetter('age')))  # 用于对象

print('-' * 50)
print(sorted(student_tuples, key=itemgetter(1, 2)))
print(sorted(student_tuples, key=lambda x: x[1:]))

print(sorted(student_objects, key=attrgetter('age', 'grade'), reverse=True))
print(sorted(student_objects, key=lambda student: (student.grade, student.age), reverse=True))

# 感受排序稳定性
data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
sorted(data, key=lambda x: x[1])
